package common.manager
{
	/**
	 *@example
	 * ObserverEvt.addRec("tes",this,fun);
	 * ObserverEvt.Send("tes");
	 * public function fun2(evt:GEevnt) : void
	 * {
	 *	 trace("test");
	 * }
	 * ObserverEvt.removeRec("tes",this,fun);
	 * 
	 * ObserverEvt.clearClassEvt(this)可以删除一个类中添加所有订阅强力推荐
	 */	
	import common.core.GEevnt;
	
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import flash.utils.Dictionary;
	
	/**
	 * 游戏广播与订阅的事件管理
	 * @author liuyong
	 */	
	public class ObserverEvt 
	{
		static private var m_evt : EventDispatcher; 
		
		static private var m_evtTab : Object; 
		
		public function ObserverEvt()
		{
			
		}
		
		/**
		 * 广播事件
		 * @param evtName   事件名
		 * @param data      内容
		 */		
		static public function Send(evtName:String,data:*=null) : void
		{
			Ins.dispatchEvent(new GEevnt(evtName,data));
		}
		
		/**
		 *添加订阅事件 
		 * @param evtName   事件名
		 * @param owner     事件所有类
		 * @param fun       侦听的回调函数
		 */		
		static public function addRec(evtName:String,owner:*,fun:Function) : void
		{
			var id:String = owner.toString();
			
			if(!evtTab.hasOwnProperty(id))
			{
				evtTab[id] = new Object;
			}
			if(!evtTab[id].hasOwnProperty(evtName))
			{
				evtTab[id][evtName] = new Dictionary;
			}
			
			evtTab[id][evtName][fun] = fun;
			
			Ins.addEventListener(evtName,fun);
		}
		
		/**
		 * 删除订阅事件
		 * @param evtName   事件名
		 * @param owner     事件所有类
		 * @param fun       侦听的回调函数
		 */		
		static public function removeRec(evtName:String,owner:*,fun:Function) : void
		{
			var id:String = owner.toString();
			
			if(evtTab.hasOwnProperty(id))
			{
				var obj:Object = evtTab[id];
				
				if(obj.hasOwnProperty(evtName))
				{
					var funObj : Object = obj[evtName];
					
					for each(var f:Function in funObj)
					{
						if(f == fun)
						{
							Ins.removeEventListener(evtName,fun);
							delete funObj[f];
							break;
						}
					}
				}
				else
				{
					throw new Error("Hven't this evtName");
				}
			}
			else
			{
//				throw new Error("Hven't this owner Event");
			}
		}
		
		/**
		 *给个this就可以干此类中添加所有事件 
		 * @param owner  事件持有类
		 * 
		 */		
		static public function clearClassEvt(owner : *) : void
		{
			var id:String = owner.toString();
			
			if(evtTab.hasOwnProperty(id))
			{
				var obj:Object = evtTab[id];
				
				for(var type:String in obj)
				{
					var evtObj : Object = obj[type];
					
					for each(var fun:Function in evtObj )
					{
						Ins.removeEventListener(type,fun);
					}
				}
				
				delete evtTab[id];
			}
			else
			{
				throw new Error("Hven't this owner Event");
			}
		}
		
		/**
		 * @return  m_evtTab单列
		 */		
		static private function get evtTab() : Object
		{
			if(!m_evtTab)
			{
				m_evtTab = new Object;
			}
			
			return m_evtTab;
		}
		
		/**
		 * @return  Evt单列
		 */		
		static private function get Ins() : EventDispatcher
		{
			if(!m_evt)
			{
				m_evt = new EventDispatcher;
			}
			
			return m_evt;
		}
	}
}